package com.example.annotations;

import java.lang.reflect.Field;

class Person {

    @Value(value = "person.name")
    private String name;

    public Person() {
        try {
            // 由于Value主机是加在字段上的，所以需要通过Field来获取该注解对应的实例
            Field nameField = Person.class.getDeclaredField("name");
            if (nameField.isAnnotationPresent(Value.class)) {
                // 我们说过，注解实际上是一个继承了java.lang.annotation.Annotation接口的特殊接口
                // 因为它是接口，所有JDK可以使用动态代理技术给它生产代理对象。
                // 这里getAnnotation方法返回的其实就是一个动态代理对象，通过这个对象，我们可以获取之前通过@Value注解设置的value
                Value annotation = nameField.getAnnotation(Value.class);
                String attrName = annotation.value();
                this.name = System.getProperty(attrName);
            }
        } catch (NoSuchFieldException ignored) {
        }
    }

    public String getName() {
        return name;
    }
}

public class AnnotationTests {
    public static void main(String[] args) {
        System.setProperty("person.name", "张三");
        Person person = new Person();
        System.out.println(person.getName()); // 输出：张三
    }
}
